namespace Digitalmes.Domain.Entities.Mes.Productions;

/// <summary>
/// 工步过程数据。
/// </summary>
/// <remarks>
/// 过程数据量可能会非常大，可考虑以下几种方式处理：
/// <para>
/// 1、分区表。
/// 在 MySQL 中分区表注意主键定义。
/// </para>
/// <para>
/// 2、分表，考虑按年或是月份进行分表。
/// <code>
/// [SplitTable(SplitType.Year)]
/// [SugarTable("prod_step_task_data_{year}{month}{day}")]
/// </code>
/// </para>
/// <para>
/// 3、使用高性能的时序数据库，如 QuestDB。
/// </para>
/// </remarks>
[SugarTable("prod_step_task_data")]
public sealed class ProdStepTaskData : EntityBase
{
    /// <summary>
    /// 工步执行记录 Id。
    /// </summary>
    public long ExecutionId { get; set; }

    /// <summary>
    /// 顺序索引，没有默认为 0。
    /// </summary>
    public int Index { get; set; }

    /// <summary>
    /// 参数名称
    /// </summary>
    [NotNull]
    public string? ParamName { get; set; } = string.Empty;

    /// <summary>
    /// 参数编码
    /// </summary>
    [NotNull]
    public string? ParamCode { get; set; } = string.Empty;

    /// <summary>
    /// 值，null 表示结果不带值。
    /// </summary>
    public double? Value { get; set; }

    /// <summary>
    /// 偏差
    /// </summary>
    public string? Tolerance { get; set; }

    /// <summary>
    /// 标准值下限
    /// </summary>
    public double? MinLimit { get; set; }

    /// <summary>
    /// 标准值上限
    /// </summary>
    public double? MaxLimit { get; set; }

    /// <summary>
    /// 单位
    /// </summary>
    public string? Unit { get; set; }

    /// <summary>
    /// 判定结果（OK/NG），默认为空。
    /// </summary>
    [NotNull]
    public string? Result { get; set; } = string.Empty;

    /// <summary>
    /// 创建时间
    /// </summary>
    /// <remarks>用于分表使用。</remarks>
    [SplitField]
    public DateTime CreateTime { get; set; } = DateTime.Now;
}
